#pragma once

#include "kernel/task/task_config_dto.h"
#include "kernel/interfaces/ILogger.h"
#include "kernel/interfaces/Result.h"
#include <QString>
#include <QJsonObject>
#include <memory>

namespace infrastructure {
namespace configuration {

/**
 * @brief 任务配置提供者
 * @details infrastructure层：负责任务配置的读取、解析、保存
 *          支持JSON文件的读写操作
 *
 *          参考三方代码: task_manager.cpp:218-312
 */
class TaskConfigProvider {
public:
    /**
     * @brief 构造函数
     * @param configFilePath 配置文件路径（相对于应用程序目录）
     * @param logger 日志记录器
     */
    explicit TaskConfigProvider(
        const QString& configFilePath = "conf/taskconf.json",
        std::shared_ptr<kernel::ILogger> logger = nullptr
    );

    ~TaskConfigProvider() = default;

    // ==================== 读取功能 ====================

    /**
     * @brief 加载任务系统配置
     * @return Result<配置DTO>
     */
    kernel::Result<kernel::task::TaskSystemConfigDTO> loadConfig();

    /**
     * @brief 重新加载配置（从文件刷新）
     * @return Result<配置DTO>
     */
    kernel::Result<kernel::task::TaskSystemConfigDTO> reloadConfig();

    /**
     * @brief 获取任务模板
     * @param name 任务名称
     * @return Result<模板DTO>
     */
    kernel::Result<kernel::task::TaskTemplateConfigDTO> getTemplate(const std::string& name);

    /**
     * @brief 获取所有任务模板名称
     * @return 任务名称列表
     */
    std::vector<std::string> getTemplateNames() const;

    /**
     * @brief 获取缓存的配置（不重新读取文件）
     * @return 配置DTO指针（未加载返回nullptr）
     */
    const kernel::task::TaskSystemConfigDTO* getCachedConfig() const;

    // ==================== 写入功能（后续实现）====================

    /**
     * @brief 保存配置到文件
     * @param config 配置DTO
     * @return Result<void>
     */
    kernel::Result<void> saveConfig(const kernel::task::TaskSystemConfigDTO& config);

    /**
     * @brief 添加任务模板
     * @param tmpl 模板DTO
     * @return Result<void>
     */
    kernel::Result<void> addTemplate(const kernel::task::TaskTemplateConfigDTO& tmpl);

    /**
     * @brief 更新任务模板
     * @param name 任务名称
     * @param tmpl 新模板DTO
     * @return Result<void>
     */
    kernel::Result<void> updateTemplate(
        const std::string& name,
        const kernel::task::TaskTemplateConfigDTO& tmpl
    );

    /**
     * @brief 删除任务模板
     * @param name 任务名称
     * @return Result<void>
     */
    kernel::Result<void> removeTemplate(const std::string& name);

    // ==================== 工具方法 ====================

    /**
     * @brief 获取配置文件完整路径
     * @return 文件路径
     */
    QString getConfigFilePath() const;

    /**
     * @brief 打开配置文件所在目录
     * @return 是否成功
     */
    bool openConfigDirectory() const;

private:
    QString m_configFilePath;  // 配置文件路径
    std::shared_ptr<kernel::ILogger> m_logger;
    kernel::task::TaskSystemConfigDTO m_cachedConfig;  // 缓存的配置
    bool m_isLoaded{false};  // 是否已加载

    // ==================== JSON解析 ====================

    /**
     * @brief 从JSON对象解析任务系统配置
     * @param rootObj JSON根对象
     * @return Result<配置DTO>
     */
    kernel::Result<kernel::task::TaskSystemConfigDTO> parseConfig(const QJsonObject& rootObj);

    /**
     * @brief 从JSON对象解析任务模板
     * @param obj JSON对象
     * @return Result<模板DTO>
     */
    kernel::Result<kernel::task::TaskTemplateConfigDTO> parseTemplate(const QJsonObject& obj);

    /**
     * @brief 从JSON对象解析子任务
     * @param obj JSON对象
     * @return Result<子任务DTO>
     */
    kernel::Result<kernel::task::SubTaskConfigDTO> parseSubTask(const QJsonObject& obj);

    /**
     * @brief 字符串转子任务类型
     * @param str 类型字符串
     * @return 子任务类型
     */
    kernel::task::SubTaskType stringToSubTaskType(const QString& str) const;

    // ==================== JSON序列化 ====================

    /**
     * @brief 配置DTO转JSON对象
     * @param config 配置DTO
     * @return JSON对象
     */
    QJsonObject configToJson(const kernel::task::TaskSystemConfigDTO& config) const;

    /**
     * @brief 模板DTO转JSON对象
     * @param tmpl 模板DTO
     * @return JSON对象
     */
    QJsonObject templateToJson(const kernel::task::TaskTemplateConfigDTO& tmpl) const;

    /**
     * @brief 子任务DTO转JSON对象
     * @param subTask 子任务DTO
     * @return JSON对象
     */
    QJsonObject subTaskToJson(const kernel::task::SubTaskConfigDTO& subTask) const;

    /**
     * @brief 子任务类型转字符串
     * @param type 子任务类型
     * @return 类型字符串
     */
    QString subTaskTypeToString(kernel::task::SubTaskType type) const;
};

} // namespace configuration
} // namespace infrastructure
